#include<bits/stdc++.h>
using namespace std;
int read(){
	int a=0;
	bool flag=true;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')
		flag=!flag;
		ch=getchar();
	}
	while(isdigit(ch)){
		a=a*10+ch-'0';
		ch=getchar();
	}
	if(flag)return a;
	return -a;
	
}
void write(int a){
	if(a==0||a==-0){
		putchar('0');
		return;
	}
	if(a<=0){
		a=-a;
		putchar('-');
	}
	short i=0,s[20];
	char ch;
	while(a>0){
		s[++i]=a%10;
		a/=10;
	}
	while(i>0){
		ch=s[i]+'0';
		putchar(ch);
		i--;
	}
	return;
}
int gcd(int a,int b){
	if(a%b==0)return b;
	return gcd(b,a%b);
}
struct stackd{
	int i=0;
	vector<int> a;
	
};
struct fen{
	int m=1,z=0;
};
bool cmp(fen a,	fen b){
	long long a1=a.z*b.m,b1=b.z*a.m;
	return a1<b1;
}
int n,m,L,V,l,r;
void find(int d,int v,int a){
	if(a==0){
		if(v>V){
			l=d;
			r=L;
			return;
		}
		l=r=-1;
		return;
	}
	if(v>V&&a>0){
		l=d;
		r=L;
		return;
	}
	if(v<=V&&a<0){
		l=r=-1;
		return;
	}
	if(v<=V&&a>0){
		long long v2=V*V-v*v;
		int s;
		s=v2/(2*a);
		s++;
		if(d+s<=L){
			l=d+s;
			r=L;
		}
		else{
			l=r=-1;
		}
		return;
	}
	if(v>V&&a<0){
		long long v2=v*v-V*V;
		a=-a;
		int s;
		s=v2/(2*a);
		if((v2%(2*a))==0)s--;
		if(d+s<=L){
			r=d+s;
			l=d;
		}
		else{
			l=d;
			r=L;
		}
		return;
	}
}

int main(){
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	for(int T=read();T>=1;T--){
		n=read();
		m=read();
		L=read();
		V=read();
		int ss[n+4][2],d,v,a,ans=0,how[L+5];
		bool can[L+5],done[n+4],can1[L+5];
		for(int i=0;i<=L;i++){
			can[i]=can1[i]=false;
			how[i]=0;
		}
		for(int i=1;i<=n;i++){
			d=read();
			v=read();
			a=read();
			find(d,v,a);
			ss[i][0]=l;
			ss[i][1]=r;
			done[i]=true;
			if(l!=-1){
				done[i]=false;
			}
		}
		int maxn=0;
		for(int i=1;i<=m;i++){
			d=read();
			if(d>maxn)maxn=d;
			can[d]=true;
		}
		if(n>50){
			for(int i=1;i<=n;i++){
			if(ss[i][0]>=0&&ss[i][0]<=maxn)
			ans++;
			
			}
			if(ans==0)m++;
			cout<<ans<<' '<<m-1<<endl;
			continue;
		}
		for(int i=1;i<=n;i++){
			int fl=false;
			for(int j=ss[i][0];j<=ss[i][1];j++){
				if(can[j]&&!fl){
					fl=true;
					ans++;
				}
				if(can[j])can1[j]=true;
			}
			done[i]=true;
			if(fl){
				done[i]=false;
				for(int j=ss[i][0];j<=ss[i][1];j++){
					if(!can[j])continue;
					how[j]++;
				}
			}
		}
		if(done[0]){
		}
		cout<<ans<<' ';
	}
	return 0;
}
